home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / ikap / etc2 / src.lzh / GetPcmPath.c < prev    next >
C/C++ Source or Header  |  2000-02-04  |  4KB  |  196 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <mbctype.h>
  5. #include <sys/xglob.h>
  6. #include "GetPcmPath.h"
  7.  
  8. /*
  9.    ラベル DEMO を定義してコンパイルすると、単独実行可能なデモを生成します
  10.    コンパイル方法
  11.    gcc -DDEMO -c GetPcmPath.c
  12.    lk GetPcmPath.o -o GetPcmPath.x -l libc.a libgnu.a
  13.  */
  14.  
  15.  
  16.  
  17. /*
  18.    環境変数 zmusic 及び zmusic0~zmusic9 から fname で指定した .PCM ファイルを検索し、
  19.    full_fname に格納する。カレントディレクトリに存在した場合は fname をそのまま返す。
  20.    返り値
  21.    = !0 : .PCM ファイルが見つかった
  22.    = 0  : .PCM ファイルが見つからなかった
  23.  */
  24. int GetPcmPath (char *fname, char *full_fname)
  25. {
  26.     FILE *fp;
  27.     unsigned char *zmusic_env;    /* 環境変数 zmusic */
  28.     unsigned char *p1;
  29.  
  30.     /* まずカレントディレクトリから fname を探す */
  31.     fp = fopen (fname, "r");
  32.     if (fp) {
  33.         fclose (fp);
  34.         strcpy (full_fname, fname);
  35.         return (!0);
  36.     }
  37.     /* 環境変数 zmusic のパスから探す */
  38.     zmusic_env = getenv ("zmusic");
  39.     if (zmusic_env == NULL)
  40.         return (0);
  41.  
  42.     p1 = zmusic_env;
  43.     /* 環境変数 zmusic の各要素を調べるループ */
  44.     while(*p1) {
  45.         unsigned char base_path[256 + 1];    /* 環境変数zmusicから1要素切り出したパス */
  46.         unsigned char *p2;
  47.  
  48.         p2 = base_path;
  49.  
  50.         /* 環境変数 zmusic から1要素切り出して base_path に格納 */
  51.         for (;;) {
  52.             unsigned char c;
  53.             c = *p2++ = *p1++;
  54.             if (ismbblead (c)) {
  55.                 *p2++ = *p1++;
  56.                 continue;
  57.             }
  58.             if (c == ';')
  59.                 break;
  60.             if (c == '\0') {
  61.                 p1--;    /* '\0' の上を指すように */
  62.                 break;
  63.             }
  64.         }
  65.         *--p2 = '\0';    /* 末尾に '\0' を付ける */
  66.  
  67.         if ((base_path[0] == '/') || (base_path[0] == '-')) {
  68.             /* "/0" などの補助環境変数だった場合 */
  69.             char zmusicn_env_name[8] = "zmusic0";    /* 最後の '0' を書き替える */
  70.             unsigned char branch_path[256 + 1];
  71.             unsigned char *zmusicn_env;    /* 環境変数 zmusic0~9 */
  72.             unsigned char *pn1, *pn2, *pn2_last;
  73.  
  74.             if (!isdigit (base_path[1]))    /* "/0"~"/9" か確認 */
  75.                 continue;
  76.  
  77.             zmusicn_env_name[6] = base_path[1];    /* 最後の '0' を書き替える */
  78.             zmusicn_env = getenv (zmusicn_env_name);
  79.             if (zmusicn_env == NULL)
  80.                 continue;
  81.  
  82.             strcpy (branch_path, base_path + 2);    /* "/0" 等を飛ばすから +2 */
  83.             _addlastsep (branch_path);
  84.             pn2_last = branch_path + strlen (branch_path);    /* branch_path の末尾を指す */
  85.  
  86.             pn1 = zmusicn_env;
  87.             /* 環境変数 zmusic0~9 の各要素を調べるループ */
  88.             while(*pn1) {
  89.                 pn2 = pn2_last;
  90.  
  91.                 /* 環境変数 zmusic0~9 から1要素切り出して branch_path に格納 */
  92.                 for (;;) {
  93.                     unsigned char c;
  94.                     c = *pn2++ = *pn1++;
  95.                     if (ismbblead (c)) {
  96.                         *pn2++ = *pn1++;
  97.                         continue;
  98.                     }
  99.                     if (c == ';')
  100.                         break;
  101.                     if (c == '\0') {
  102.                         pn1--;    /* '\0' の上を指すように */
  103.                         break;
  104.                     }
  105.                 }
  106.                 *--pn2 = '\0';
  107.  
  108.                 _addlastsep (branch_path);
  109.                 strcat (branch_path, fname);
  110.                 _tobslash (branch_path);
  111. #ifdef DEBUG
  112.                 printf ("branch_path=%s\n", branch_path);
  113. #endif
  114.                 fp = fopen (branch_path, "r");
  115.                 if (fp) {
  116.                     fclose (fp);
  117.                     strcpy (full_fname, branch_path);
  118.                     return (!0);
  119.                 }
  120.             }
  121.  
  122.         } else {
  123.             /* 普通にディレクトリが指定されていた場合 */
  124.             _addlastsep (base_path);
  125.             strcat (base_path, fname);
  126.             _tobslash (base_path);
  127. #ifdef DEBUG
  128.             printf ("base_path=%s\n", base_path);
  129. #endif
  130.             fp = fopen (base_path, "r");
  131.             if (fp) {
  132.                 fclose (fp);
  133.                 strcpy (full_fname, base_path);
  134.                 return (!0);
  135.             }
  136.         }
  137.     }
  138.  
  139.     return (0);
  140. }
  141.  
  142.  
  143.  
  144. #ifdef DEMO
  145. void usage (void)
  146. {
  147.     puts ("環境変数 zmusic から .PCM ファイルを検索するデモ GetPcmPath.X ver0.01\n"
  148.           "        programmed by Mitsuky <FreeSoftware>\n"
  149.           "使用法 : GetPcmPath ファイル名\n"
  150.         );
  151. }
  152.  
  153.  
  154.  
  155. int main (int argc, char *argv[])
  156. {
  157.     int i;
  158.     int slash_flag = 0;
  159.     char *fname;        /* 展開前のファイル名 */
  160.     char full_fname[92];    /* フルパスのファイル名が返るバッファ */
  161.  
  162.     {
  163.         char *temp;
  164.  
  165.         temp = getenv ("SLASH");
  166.         if ((temp != NULL) && (*temp == '/')) {
  167.             slash_flag = 1;
  168.         }
  169.     }
  170.     for (i = 1; i < argc; i++) {
  171.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  172.             switch (*(argv[i] + 1)) {
  173.  
  174.             default:
  175.                 usage ();
  176.                 return (-1);
  177.             }
  178.         } else {
  179.             fname = argv[i];
  180.         }
  181.     }
  182.  
  183.     if (fname == NULL) {
  184.         usage ();
  185.         return (-1);
  186.     }
  187.     if (GetPcmPath (fname, full_fname)) {
  188.         printf ("%s を環境変数 zmusic から検索した結果、%s が見つかりました\n", fname, full_fname);
  189.     } else {
  190.         printf ("%s が見つかりません\n", fname);
  191.     }
  192.  
  193.     return (0);
  194. }
  195. #endif
  196.